<?php
/**
 * BlogAction 記事クラス
 */
class Blog_Action_Article {
	private $Article;
	private $Modify;

	public function __construct ($Article = null) {
		if ($Article) {
			$this->Article = $Article;
		}
	}

	/**
	 * 整形後の記事を取得する
	 * 整形していない場合はオリジナルが渡される
	 */
	public function getModify () {
		if ($this->Modify) {
			return $this->Modify;
		} else {
			return $this->Article;
		}
	}

	/**
	 * ブログ記事を整形する
	 * プロパティ Modify に代入した記事の本文を整形する。
	 */
	function modifyArticle () {
		if (empty ($this->Article)) return false;

		$this->Modify = $this->Article;

		$ReturnText = '';
		Y('Logger.Debug', '記事モディファイ開始');
		// 改行コードの統一
		$this->Modify['Text'] = str_replace ("\r\n", "\n", $this->Modify['Text']);
		$this->Modify['Text'] = str_replace ("\r", "\n", $this->Modify['Text']);

		$Text = explode ("\n", $this->Modify['Text']);
		foreach ($Text as $Line) {
			$Line = trim ($Line);
			// 改行のみの時はそのまま<BR>
			if (empty($Line)) {
				$ReturnText .= ("<br />\n");
				continue;
			}
			// http://～は自動でリンク化
			$Check = strip_tags ($Line);
			if (preg_match ('/(https?|ftp)(\:\/\/[^ ]+)/', $Check, $Matches)) {
				$Line = str_replace ($Matches[0], '<a href="'.$Matches[1].$Matches[2].'" target="_blank">'.$Matches[1].$Matches[2]. '</a>', $Line);
			} elseif (preg_match ('/([^ ]+)@([^ ]+)/', $Check, $Matches)) {
				$Line = str_replace ($Matches[0], '<a href="mailto:'.$Matches[1].'@'.$Matches[2].'">'.$Matches[1].'@'.$Matches[2]. '</a>', $Line);
			}

			// 正規表現による独自タグ解析
			while ($this->preg_originaltag($Line)) {}
	
			// タグのみが記述されている時は<BR>を付与しない
			// ただしIMGは例外。
			$Check = strip_tags ($Line, '<img>');
			if (empty ($Check)) {
				$ReturnText .= ($Line."\n");
				continue;
			}
	
			// 何にも一致しない時は<BR>付与
			$ReturnText .= ($Line."<br />\n");
		}
		$this->Modify['Text'] = $ReturnText;
		
//		$this->Modify['ArticleURL'] = $this->BaseURL.'/article/'.$this->Modify['ID'];
		return true;
	}

	/**
	 * 正規表現を使って独自タグをプラグイン動作する
	 */
	function preg_originaltag (&$Line) {
		$CmdArg = array();
		$PluginDir = dirname(__FILE__).'/../plugin/';
		$PluginResult = null;

		$IsOriginalTag = preg_match ('/(.*)<cmd([^>]*)>(.*)/i', $Line, $CmdArg);

		if ($IsOriginalTag) {
			Y('Logger.Debug', 'タグ cmd を検出');

			//指定属性を解析
			$PluginVarsPre = explode (' ', trim($CmdArg[2]));
			foreach ($PluginVarsPre as $var) {
				if (false === strpos($var, '=')) {
					$PluginVars[$var] = true;
				} else {
					list($Name, $Val) = explode ('=', $var, 2);
					$PluginVars[strtolower($Name)] = trim($Val, "'\"");
				}
			}
	
			if (empty ($PluginVars['mod'])) {
				$PluginResult = '<FONT color="red">【Error】プラグインモジュールの名称が指定されていません。</FONT>';
			} else {
				$PluginVars['mod'] = strtolower ($PluginVars['mod']);
				if (!Y('Module.List.Blog.Plugins.'.$PluginVars['mod'].'$')) {
					Y('Logger.Debug', 'プラグイン '.$PluginVars['mod'].' をロード開始');
					if (file_exists($PluginDir.'plg'.$PluginVars['mod'].'.class.php')) {
						include_once ($PluginDir.'plg'.$PluginVars['mod'].'.class.php');
						$Plugin = 'Blog_plg_'.$PluginVars['mod'];
						Y('Module.List.Blog.Plugins.'.$PluginVars['mod'].'+', new $Plugin());
					} else {
						$PluginResult = '<FONT color="red">【Error】プラグイン'.$PluginVars['mod'].'が存在しません。記事の記述を見直してください。</FONT>';
					}
				}
				if (!$PluginResult) $PluginResult = Y('Module.List.Blog.Plugins.'.$PluginVars['mod'], $PluginVars, $this->Modify);
			}
			$Line = $CmdArg[1] . $PluginResult . $CmdArg[3];
		}
		return $IsOriginalTag;
	}

}
?>